package com.building18.aspect;

import com.building18.annotations.RequirePermCheck;
import com.building18.handler.MyAssert;
import com.building18.service.PermissionService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.List;

@Component
@Aspect
public class PermAspect {

    @Autowired
    private PermissionService permissionService;

    //切入点
    @Pointcut("execution(public * com.building18.service.impl.* .* (..))")
    public void pt() {

    }

    /**
     * 判断摁钮的权限
     * @param jp 连接点
     */
    @Before("pt()")
    public void before(JoinPoint jp) {
        //查询方法签名中的Method对象
        MethodSignature signature = (MethodSignature) jp.getSignature(); //获取方法签名（包含方法名、参数、返回值等信息）
        Method method = signature.getMethod(); //获取目标方法的 Method 对象(反射机制中用于描述方法的类)  原理:从签名中还原出它所描述的 Method 对象

        //判断方法上的注解
        if (method.isAnnotationPresent(RequirePermCheck.class)) {
            RequirePermCheck annotation = method.getAnnotation(RequirePermCheck.class);//获取(自定义注解)注解实例
            String permCode = annotation.value();  //获取权限编码

            //判断用户是否拥有权限
            List<String> userButtonPerms = permissionService.selectAllButtonPerms();
            boolean flg = userButtonPerms.contains(permCode);

            MyAssert.error(!flg, "您没有权限访问该功能!!!");
        }
        //正常执行
    }
}
